' returns the next closest standard value of given standard series (and all smaller series)
Public Function NomResVal(Optional Source As Double = 1#, Optional Series As Integer = 24)

    Dim rval, last_res, closest, exponent, mantissa
    
    '1% Resistor Value array E24, E48 and E96
    
    E6 = Array(1#, 1.5, 2.2, 3.3, 4.7, 6.8)
    
    E12 = Array(1#, 1.2, 1.5, 1.8, 2.2, 2.7, 3.3, 3.9, 4.7, 5.6, 6.8, 8.2)
    
    E24 = Array(1#, 1.1, 1.2, 1.3, 1.5, 1.6, 1.8, 2#, _
    2.2, 2.4, 2.7, 3#, 3.3, 3.6, 3.9, 4.3, _
    4.7, 5.1, 5.6, 6.2, 6.8, 7.5, 8.2, 9.1)
    
    E48 = Array(1#, 1.05, 1.1, 1.15, 1.21, 1.27, 1.33, 1.4, _
    1.47, 1.54, 1.62, 1.69, 1.78, 1.87, 1.96, 2.05, _
    2.15, 2.26, 2.37, 2.49, 2.61, 2.74, 2.87, 3.01, _
    3.16, 3.32, 3.48, 3.65, 3.83, 4.02, 4.22, 4.42, _
    4.64, 4.87, 5.11, 5.36, 5.62, 5.9, 6.19, 6.49, _
    6.81, 7.15, 7.5, 7.87, 8.25, 8.66, 9.09, 9.53)
    
    E96 = Array(1#, 1.02, 1.05, 1.07, 1.1, 1.13, 1.15, 1.18, _
    1.21, 1.24, 1.27, 1.3, 1.33, 1.37, 1.4, 1.43, _
    1.47, 1.5, 1.54, 1.58, 1.62, 1.65, 1.69, 1.74, _
    1.78, 1.82, 1.87, 1.91, 1.96, 2#, 2.05, 2.1, _
    2.15, 2.21, 2.26, 2.32, 2.37, 2.43, 2.49, 2.55, _
    2.61, 2.67, 2.74, 2.8, 2.87, 2.94, 3.01, 3.09, _
    3.16, 3.24, 3.32, 3.4, 3.48, 3.57, 3.65, 3.74, _
    3.83, 3.92, 4.02, 4.12, 4.22, 4.32, 4.42, 4.53, _
    4.64, 4.75, 4.87, 4.99, 5.11, 5.23, 5.36, 5.49, _
    5.62, 5.76, 5.9, 6.04, 6.19, 6.34, 6.49, 6.65, _
    6.81, 6.98, 7.15, 7.32, 7.5, 7.68, 7.87, 8.06, _
    8.25, 8.45, 8.66, 8.87, 9.09, 9.31, 9.53, 9.76)
    
    E192 = Array(1#, 1.01, 1.02, 1.04, 1.05, 1.06, 1.07, 1.09, _
    1.1, 1.11, 1.13, 1.14, 1.15, 1.17, 1.18, 1.2, _
    1.21, 1.23, 1.24, 1.26, 1.27, 1.29, 1.3, 1.32, _
    1.33, 1.35, 1.37, 1.38, 1.4, 1.42, 1.43, 1.45, _
    1.47, 1.49, 1.5, 1.52, 1.54, 1.56, 1.58, 1.6, _
    1.62, 1.64, 1.65, 1.67, 1.69, 1.72, 1.74, 1.76, _
    1.78, 1.8, 1.82, 1.84, 1.87, 1.89, 1.91, 1.93, _
    1.96, 1.98, 2#, 2.03, 2.05, 2.08, 2.1, 2.13, _
    2.15, 2.18, 2.21, 2.23, 2.26, 2.29, 2.32, 2.34, _
    2.37, 2.4, 2.43, 2.46, 2.49, 2.52, 2.55, 2.58, _
    2.61, 2.64, 2.67, 2.71, 2.74, 2.77, 2.8, 2.84, _
    2.87, 2.91, 2.94, 2.98, 3.01, 3.05, 3.09, 3.12, _
    3.16, 3.2, 3.24, 3.28, 3.32, 3.36, 3.4, 3.44, _
    3.48, 3.52, 3.57, 3.61, 3.65, 3.7, 3.74, 3.79, _
    3.83, 3.88, 3.92, 3.97, 4.02, 4.07, 4.12, 4.17, _
    4.22, 4.27, 4.32, 4.37, 4.42, 4.48, 4.53, 4.59, _
    4.64, 4.7, 4.75, 4.81, 4.87, 4.93, 4.99, 5.05, _
    5.11, 5.17, 5.23, 5.3, 5.36, 5.42, 5.49, 5.56, _
    5.62, 5.69, 5.76, 5.83, 5.9, 5.97, 6.04, 6.12, _
    6.19, 6.26, 6.34, 6.42, 6.49, 6.57, 6.65, 6.73, _
    6.81, 6.9, 6.98, 7.06, 7.15, 7.23, 7.32, 7.41, _
    7.5, 7.59, 7.68, 7.77, 7.87, 7.96, 8.06, 8.16, _
    8.25, 8.35, 8.45, 8.56, 8.66, 8.76, 8.87, 8.98, _
    9.09, 9.19, 9.31, 9.42, 9.53, 9.65, 9.76, 9.88)
    
    ResValue = Array(E6, E12, E24, E48, E96, E192)
    
    
  '  ResValue = Array(1#, 1.02, 1.05, 1.07, 1.1, 1.13, 1.15, 1.18, 1.2, 1.21, 1.24, 1.27, 1.3, 1.33, 1.37, 1.4, 1.43, 1.47, _
  '                  1.5, 1.54, 1.58, 1.6, 1.62, 1.65, 1.69, 1.74, 1.78, 1.8, 1.82, 1.87, 1.91, 1.96, 2#, 2.05, 2.1, 2.15, _
  '                  2.2, 2.21, 2.26, 2.32, 2.37, 2.4, 2.43, 2.49, 2.55, 2.61, 2.67, 2.7, 2.74, 2.8, 2.87, 2.94, 3#, 3.01, _
  '                  3.09, 3.16, 3.24, 3.3, 3.32, 3.4, 3.48, 3.57, 3.6, 3.65, 3.74, 3.83, 3.9, 3.92, 4.02, 4.12, 4.22, 4.3, _
  '                  4.32, 4.42, 4.53, 4.64, 4.7, 4.75, 4.87, 4.99, 5.1, 5.11, 5.23, 5.36, 5.49, 5.6, 5.62, 5.76, 5.9, 6.04, _
  '                  6.19, 6.2, 6.34, 6.49, 6.65, 6.8, 6.81, 6.98, 7.15, 7.32, 7.5, 7.68, 7.87, 8.06, 8.2, 8.25, 8.45, 8.66, _
  '                  8.87, 9.09, 9.1, 9.31, 9.53, 9.76, 10#)
                    
    exponent = WorksheetFunction.RoundDown(WorksheetFunction.Log(Source, 10), 0)
    
    mantissa = Source / 10 ^ exponent
    
    prev_closest = ResValue(0)(0)
    
    Series = WorksheetFunction.RoundDown(WorksheetFunction.Log(Series / 6, 2), 0)
    
    If Series > 5 Then
        Series = 5
    End If
    If Series < 0 Then
        Series = 0
    End If
    
    
    For ser = 0 To Series
    
        For Each rval In ResValue(ser)
        
            closest = rval
            
            If rval < mantissa Then
                last_res = rval
            ElseIf rval = mantissa Then
                Exit For
            Else
                If (rval - mantissa) >= (mantissa - last_res) Then
                    closest = last_res
                End If
                Exit For
            End If
            
        Next rval
        
        If Abs(closest - mantissa) > Abs(prev_closest - mantissa) Then
            closest = prev_closest
        End If
        prev_closest = closest
    
    Next ser
    
    NomResVal = closest * (10 ^ exponent)

End Function
